import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';
import { _HttpClient } from '@delon/theme';
import { EAEnvironmentService } from '@shared';
import { NzTreeComponent } from 'ng-zorro-antd/tree';
import { SystemService } from '../../../services/system.service';

@Component({
  selector: 'app-cuc-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['menu.less']
})
export class SettingMenuComponent implements OnInit, OnChanges {
  @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent;
  origin: any = { buttonInfoList: [], dictList: [] };
  node: any = {};
  authority: any[] = [];
  defaultSelectedKeys: any[] = [];
  defaultExpandedKeys: any[] = [];
  defaultCheckedKeys: any[] = [];
  functionList: any[] = [];
  allChecked = false;
  indeterminate = true;
  @Input() type = 'edit';
  @Input() source = '';
  @Input() appId = this.envSrv.env.appId;
  @Input() isAuthorityIdDTOList: any[] = [];
  @Input() authorityAssistId: any[] = [];
  @Input() roleId: any;
  @Output() changeData = new EventEmitter();
  constructor(public service: SystemService, private cdr: ChangeDetectorRef, private envSrv: EAEnvironmentService) {}
  ngOnChanges(changes: SimpleChanges): void {
    if (changes.isAuthorityIdDTOList) {
      if (this.type === 'edit') {
        this.authority = this.isAuthorityIdDTOList || [];
      }
    }
    // if (changes.authorityAssistId) {
    //   this.defaultCheckedKeys = [...this.authorityAssistId];
    // }
  }

  ngOnInit() {
    this.getAllFunction();
  }
  getAllFunction() {
    this.service
      .request(this.service.$api_getAllFunctionInfoByAppId, { appId: this.appId || this.envSrv.env.appId }, 'POST', true, 'FORM')
      .subscribe(res => {
        // if (this.source === 'onlyRelationAuth') {
        //   this.addDisabledTree(res);
        // } else {
        //   // this.addDisabledLeafTree(res);
        // }
        this.functionList = res;
        this.defaultCheckedKeys = this.authorityAssistId;
        this.cdr.detectChanges();
      });
  }
  addAuthority(origin: { id: any; all: any }, node: { buttonInfoList: any[] }, item?: { checked: any; functionButtonId: any }) {
    console.log(origin, node);

    if (this.authority?.length && this.authority.filter(authItem => authItem.authorityId === origin.id).length) {
      // 判断此菜单权限是否已经存在权限列表中
      // 当前操作菜单id存在权限列表里
      this.authority.forEach(menuItem => {
        console.log(menuItem);
        console.log(item);

        if (menuItem.authorityId === origin.id) {
          menuItem.buttonAuthorityIds = menuItem.buttonAuthorityIds || []; // 防止属性不存在，给属性指定数据类型
          if (item) {
            // 单选
            if (item.checked) {
              if (menuItem.buttonAuthorityIds.indexOf(item.functionButtonId) === -1) {
                // 如果该按钮在数据权限数组中不存在
                menuItem.buttonAuthorityIds.push(item.functionButtonId);
              }
            } else {
              if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) {
                menuItem.buttonAuthorityIds.forEach((btnItem: any, index: any) => {
                  if (btnItem === item.functionButtonId) {
                    menuItem.buttonAuthorityIds.splice(index, 1);
                  }
                });
              }
            }
          } else {
            // 全选
            if (origin.all) {
              node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean }) => {
                if (menuItem.buttonAuthorityIds.indexOf(nodeItem.id) === -1) {
                  menuItem.buttonAuthorityIds.push(nodeItem.id);
                  nodeItem.checked = true;
                }
              });
            } else {
              if (menuItem.buttonAuthorityIds && menuItem.buttonAuthorityIds.length) {
                menuItem.buttonAuthorityIds = [];
                node.buttonInfoList.forEach((nodeItem: { checked: boolean }) => {
                  nodeItem.checked = false;
                });
              }
            }
          }
        }
      });
    } else {
      // 数组为空的时候
      const buttonAuthorityIds = [];
      if (item) {
        // 全选
        buttonAuthorityIds.push(item.functionButtonId);
      } else {
        node.buttonInfoList.forEach((nodeItem: { id: any; checked: boolean; _isHalfChecked: boolean }) => {
          if (origin.all) {
            buttonAuthorityIds.push(nodeItem.id);
            nodeItem.checked = true;
          }
        });
      }
      const obj: any = {
        authorityId: origin.id,
        buttonAuthorityIds
      };
      this.authority.push(obj);
    }
    this.checkTreeNode(node, origin);
  }

  addDict(item: { checked: any; itemId: any; itemKey: any }, dictItem: { dictId: any }, origin: { id: any }, node: any) {
    if (this.authority.length) {
      // 判断此菜单权限是否已经存在权限列表中
      if (this.authority.filter(authItem => authItem.authorityId === origin.id).length) {
        // 当前操作菜单id存在权限列表里
        this.authority.forEach((menuItem, menuIndex) => {
          if (menuItem.authorityId === origin.id) {
            menuItem.dataAuthority = menuItem.dataAuthority || []; // 防止属性不存在，给属性指定数据类型
            if (item.checked) {
              if (menuItem.dataAuthority.filter((ele: { dictItemId: any }) => ele.dictItemId === item.itemId).length === 0) {
                // 如果该按钮在数据权限数组中不存在
                menuItem.dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId });
              }
            } else {
              if (menuItem.dataAuthority && menuItem.dataAuthority.length) {
                menuItem.dataAuthority.forEach((btnItem: { dictItemId: any }, index: any) => {
                  if (btnItem.dictItemId === item.itemId) {
                    menuItem.dataAuthority.splice(index, 1);
                  }
                });
              }
            }
          }
        });
      } else {
        // 当前操作菜单id不存在权限列表里
        const dataAuthority = [];
        dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId });
        const obj: any = {
          authorityId: origin.id,
          dataAuthority
        };
        this.authority.push(obj);
      }
    } else {
      // 数组为空的时候
      const dataAuthority = [];
      dataAuthority.push({ dictItemId: item.itemId, itemKey: item.itemKey, dictId: dictItem.dictId });
      const obj: any = {
        authorityId: origin.id,
        dataAuthority
      };
      this.authority.push(obj);
    }
    this.checkTreeNode(node, origin);
  }

  checkTreeNode(node: any, origin: { id: any }) {
    const checkedNode: any = this.nzTreeComponent.getCheckedNodeList();
    const allCheckedArr: any[] = [];
    this.overTree(checkedNode, allCheckedArr);
    this.authority.forEach(authItem => {
      if (authItem.authorityId === origin.id) {
        if (
          (authItem.buttonAuthorityIds && authItem.buttonAuthorityIds.length) ||
          (authItem.dataAuthority && authItem.dataAuthority.length)
        ) {
          if (allCheckedArr.indexOf(node.key) === -1) {
            allCheckedArr.push(node.key);
          }
        } else {
          if (allCheckedArr.indexOf(node.key) !== -1) {
            allCheckedArr.forEach((ele, index) => {
              if (ele === origin.id) {
                allCheckedArr.splice(index, 1);
              }
            });
          }
        }
      }
    });
    this.defaultCheckedKeys = allCheckedArr;
  }

  overTree(children: any[], a: any[]) {
    children.forEach(item => {
      a.push(item.key);
      if (item.isLeaf) {
        return;
      }
      if (item.children && item.children.length) {
        this.overTree(item.children, a);
      }
    });
  }

  addDisabledTree(arr: any[]) {
    arr.forEach((item: any) => {
      item.disableCheckbox = true;
      if (item.isLeaf) {
        return;
      }
      if (item.children && item.children.length) {
        this.addDisabledTree(item.children);
      }
    });
  }
  addDisabledLeafTree(arr: any[]) {
    arr.forEach((item: any) => {
      if (item.isLeaf) {
        return;
      }
      item.disableCheckbox = true;
      if (item.children && item.children.length) {
        this.addDisabledLeafTree(item.children);
      }
    });
  }
  nzEvent(event: any): void {
    this.origin = event.node.origin;
    this.node = event.node.origin;
    if (!event.node.origin.isLeaf) {
      event.node.isExpanded = !event.node.isExpanded;
    } else {
      this.initButtonList(event.node.key, event.node.origin);
      // this.initDictList(event.node.key, event.node.origin);
    }
  }

  washTree() {
    const authorityMenu: any[] = []; // this.authority
    const tempAuthorityIdDTOListMenu: any[] = [];
    const checkedNode: any = this.nzTreeComponent.getCheckedNodeList();
    const halfCheckedNode: any = this.nzTreeComponent.getHalfCheckedNodeList();
    this.authorityAssistId = [];
    halfCheckedNode.forEach((item: { key: any }) => {
      authorityMenu.push({ authorityId: item.key, isUpdateAuthority: 0 });
      tempAuthorityIdDTOListMenu.push(item.key);
    });
    this.overWashTree(checkedNode, tempAuthorityIdDTOListMenu, authorityMenu);
    if (this.authority && this.authority.length) {
      this.authority.forEach(item => {
        item.isUpdateAuthority = 1;
        if (tempAuthorityIdDTOListMenu.indexOf(item.authorityId) !== -1) {
          tempAuthorityIdDTOListMenu.forEach((oldItem, oldIndex) => {
            if (oldItem === item.authorityId) {
              authorityMenu[oldIndex] = item;
            }
          });
        }
      });
    }
    const result = {
      authority: authorityMenu,
      authorityAssistId: this.authorityAssistId
    };
    this.changeData.emit(result);
    return result;
  }
  overWashTree(children: any[], tempAuthorityIdDTOListMenu: any[], authorityMenu: any[]) {
    children.forEach((item: any) => {
      this.authorityAssistId.push(item.key);
      tempAuthorityIdDTOListMenu.push(item.key);
      authorityMenu.push({ authorityId: item.key, isUpdateAuthority: 1 });
      if (item.isLeaf) {
        return;
      }
      if (item.children) {
        this.overWashTree(item.children, tempAuthorityIdDTOListMenu, authorityMenu);
      }
    });
  }

  initButtonList(id: any, origin: any) {
    if (origin.expanded) {
      origin.children.forEach((item: any, index: number) => {
        if (item.selected) {
          if (origin.checked) {
            this.authority.splice(index, 1);
            const buttonAuthorityIds: any = [];
            item.buttonInfoList.forEach((btnItem: any) => {
              btnItem.checked = true;
              buttonAuthorityIds.push(btnItem.functionButtonId);
            });
            this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 });
          } else {
            this.authority.splice(index, 1);
            item.buttonInfoList.forEach((btnItem: any) => {
              btnItem.checked = false;
            });
          }
        }
      });
    }
    const params = {
      id
    };
    this.service.request(this.service.$api_getFunctionButtonInfo, params).subscribe(res => {
      if (res) {
        origin.buttonInfoList = res;
        origin.all = false;
        console.log(origin);

        // 判断此菜单下是否已有此按钮权限
        this.againGetBtn(id, origin);
      }
    });
  }
  // 再次请求,需要判断暂存权限数组是否已有此权限
  againGetBtn(id: any, origin: any) {
    if (this.authority && this.authority.length === 0) {
      const buttonAuthorityIds: any = [];
      if (origin.checked) {
        origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
          btnItem.checked = true;
          buttonAuthorityIds.push(btnItem.functionButtonId);
        });
        this.authority.push({ authorityId: origin.key, buttonAuthorityIds, isUpdateAuthority: 1 });
      }
    } else {
      if (origin.checked) {
        //菜单勾选情况下
        if (this.authority.some(item => item.authorityId === id)) {
          this.authority.forEach(item => {
            if (item.authorityId === id) {
              // 如果当前菜单Id存在权限列表里，并且等于暂存权限数组的Id
              if (item.buttonAuthorityIds && item.buttonAuthorityIds.length) {
                // 如果当前菜单Id权限数组不为空
                origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
                  // 判断已有权限id是否存在
                  if (item.buttonAuthorityIds.indexOf(btnItem.functionButtonId) !== -1) {
                    btnItem.checked = true;
                  } else {
                    btnItem.checked = false;
                  }
                });
              }
            }
          });
        } else {
          this.authority.push({ authorityId: origin.key, buttonAuthorityIds: [], isUpdateAuthority: 1 });
          this.authority.forEach(item => {
            origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
              btnItem.checked = true;
              item.buttonAuthorityIds.push(btnItem.functionButtonId);
            });
          });
        }
      } else {
        // 菜单未勾选，要删除权限
        this.authority.forEach((item, index) => {
          if (item.authorityId === id) {
            // 如果当前菜单Id存在权限列表里，并且等于暂存权限数组的Id
            this.authority.splice(index, 1);
            origin.buttonInfoList.forEach((btnItem: { functionButtonId: any; checked: boolean }) => {
              btnItem.checked = false;
            });
          }
        });
      }
    }
  }

  initDictList(id: any, origin: any) {
    const params = {
      id
    };
    this.service.request(this.service.$api_getFunctionDataInfo, params).subscribe(res => {
      if (res) {
        origin.dictList = res;
        // 判断此菜单下是否已有此按钮权限
        this.againGetDict(id, origin);
      }
    });
  }
  // 再次请求,需要判断暂存权限数组是否已有此权限
  againGetDict(id: any, origin: any) {
    if (this.authority.length === 0) {
      return;
    }
    this.authority.forEach(item => {
      if (item.authorityId === id) {
        // 如果当前菜单Id等于暂存权限数组的Id
        if (item.dataAuthority && item.dataAuthority.length) {
          // 如果当前菜单Id权限数组不为空
          origin.dictList.forEach((ele: { dictItem: any[] }) => {
            // 判断已有权限id是否存在
            ele.dictItem.forEach((dictItem: { itemId: any; checked: boolean; cheked: boolean }) => {
              item.dataAuthority.forEach((dataItem: { dictItemId: any }) => {
                if (dataItem.dictItemId === dictItem.itemId) {
                  dictItem.checked = true;
                } else {
                  dictItem.cheked = false;
                }
              });
            });
          });
        }
      }
    });
  }
}
